package od_2025A.one;


import java.util.*;

/**
 * https://blog.csdn.net/qq_45776114/article/details/146028710
 * todo 不要胡思乱想，按照正常流程进行模拟和建模，不要想偏了，如果想不出来，再去想偏门方法；
 * todo 就像这道题一样，老老实实的去计算每一个指令的面积，然后再加上剩余的面积就对了呀；
 * todo 这道题，答案的解法更好，这里之前踩坑，hashmap的遍历顺序和加入顺序是不同的呀，这我都忘记了
 * todo 考虑精度问题，int最大只有21亿，题目中要求已经有40亿了，所以用long
 */
public class Test09 {

    public static void main(String[] args) {
        // 处理输入内容
        Scanner scanner = new Scanner(System.in);
        String str1 = scanner.nextLine();
        Integer[] strArray = Arrays.stream(str1.split(" ")).map(Integer::parseInt).toArray(Integer[]::new);
        // 指令
        Map<Integer, Integer> map = new TreeMap<>();
        for (int i = 0; i < strArray[0]; i++) {
            Integer[] line = Arrays.stream(scanner.nextLine().split(" ")).map(Integer::parseInt).toArray(Integer[]::new);
            map.put(line[0], line[1]);
        }
        scanner.close();

        // 遍历指令，计算每一条指令占有的面积
        Integer e = strArray[1];
        int lastY = 0;
        int lastX = 0;
        int res = 0;
        for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
            Integer x = entry.getKey();
            Integer offset = entry.getValue();
            res += Math.abs(lastY) * (x - lastX);
            lastX = x;
            lastY = lastY + offset;
        }
        res += Math.abs(lastY) * (e - lastX);
        System.out.println(res);
    }

    /**
     * 这种方法虽然可以解决，但是不够好，最好的还是答案中的代码
     */
    public static void process02() {
        // 处理输入内容
        Scanner scanner = new Scanner(System.in);
        String str1 = scanner.nextLine();
        Integer[] strArray = Arrays.stream(str1.split(" ")).map(Integer::parseInt).toArray(Integer[]::new);
        // 指令
        Map<Integer, Integer> map = new TreeMap<>();
        for (int i = 0; i < strArray[0]; i++) {
            Integer[] line = Arrays.stream(scanner.nextLine().split(" ")).map(Integer::parseInt).toArray(Integer[]::new);
            map.put(line[0], line[1]);
        }
        scanner.close();

        // e
        Integer e = strArray[1];
        // 面积
        long sum = 0;
        // y 坐标
        int y = 0;
        for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
            Integer x = entry.getKey();
            Integer offset = entry.getValue();
            int length = e - x;
            int absOffset = Math.abs(offset);
            int absY = Math.abs(y);
            if ((y >= 0 && offset >= 0) || (y < 0 && offset < 0)) {
                sum += length * absOffset;
            } else {
                if (absY >= absOffset) {
                    sum = sum - (length * absOffset);
                } else {
                    sum = sum - (length * absY) + (length * (absOffset - absY));
                }
            }
            y = y + offset;
        }
        System.out.println(sum);
    }
}
